package com.sky.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Aspect
//@Order(2)//用来控制通知的执行顺序，默认按照类名的顺序执行
@Component
@Slf4j
public class TimeAspect {

    @Around("execution(* com.sky.service.*.*(..))")//切入点表达式,execution(* com.sky.service.*.*(..))最优的写法,其他可以省略的都省略了
    //描述切入点方法，基于接口描述，而不是实现类。可以增强拓展性
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();

        Object result = joinPoint.proceed();//调用原始方法运行
        long end = System.currentTimeMillis();
        log.info(joinPoint.getSignature()+"方法运行时间：{}ms",end-start);//joinPoint.getSignature()获取哪个方法调用了
//        joinPoint.getSignature().getName();获取方法名
//        joinPoint.getArgs();获取方法参数
        joinPoint.getTarget().getClass().getName();//获取目标类名
        return  result;
    }

}
